// MarshalANSI1.cpp
// compile with: /clr
#pragma once
#include <string>
#include <windows.h>
#include <sstream>
//#include <msclr\marshal.h>



#include "fmod.h"
#include "fmod.hpp"
#include "fmod_dsp.h"
#include "fmod_errors.h"



#include <iostream>

#pragma comment (lib, "fmodex_vc.lib")

using namespace std;


class MediaPlayControler
{
private:
	FMOD::System 	*system;
	FMOD::Sound 	*sound;
	FMOD::Channel 	*channel;

	



	bool is_ok;		// leidimas / draudimas kai kurioms funkcijoms vygdyti
					// true reiksme buna kai yra uzkrautas takelis
					// false jeigu takelis netinkamas arba jis yra keiciamas kitu takeliu.
					// false atveju funkcijos kurios valdo takelio grojima ar gauna jo informacija nieko nepriima ir nieko negrazina
					// tam kad nebutu crashu

	float volume;	// cia savaime suprantama saugoma garso lygis. 
	float position;
	bool paused;	// ar uzdeta pauze?


	wstring filePath;


	bool isUpToDate;

public:
	// konstruktorius
	MediaPlayControler()
	{
		FMOD::System_Create(&system);
		system->init(1, FMOD_INIT_NORMAL, 0);

		

		//FSOUND_DSP_SetActive(FSOUND_DSP_GetFFTUnit(), True)

		// defaultai
		volume = 1.0;
		position = 0.0;
		paused = false;
		is_ok = false;

		isUpToDate = false;
		
	}
	
	// destruktorius
	~MediaPlayControler()
	{
		if(channel != NULL) channel->stop();
		if(sound != NULL) sound->release();
		if(system != NULL) system->release();
	}
	
	// uzkrauna faila ir is karto paleidzia ji groti
	// fileName - pilnas arba dalinis (nuo vygdomojo failo) kelias iki audio failo
	bool load(wstring fileName);	

	// paleidzia garso takelio atkurima
	void play();	
	
	// sustabdo takelio atkurima
	void pause();	
	
	// sustabdo garso takelio atkurima ir atsuka iki priekio
	void stop();	

	// nustato nuo kurios vietos atkurt garso takeli
	// p - pozicija nuo 0.0 iki 1.0 Reiksmes virsijancios ribas grazinamos iki ribiniu reiksmiu
	void setProgres(float p);	
	
	// nustato garso takelio atkurimo garsa
	// v - garsumo lygis nuo 0.0 iki 1.0 Reiksmes virsijancios ribas grazinamos iki ribiniu reiksmiu
	void setVolume(float v);	

	// NEREALIZUOTA FUNKCIJA
	string getTime();
	
	// gauna nustatytaji garso lygi
	// @return - float nuo 0.0 iki 1.0
	float getVolume();	
	
	// gauna takelio prograso lygi
	// @return - float nuo 0.0 iki 1.0
	float getProgres();

	// gauna ar takelis sustabdytas
	// @return - true/false
	bool getPaused();

	// gauna takelio ilgi
	// @return - takelio ilgis milisekundemis
	unsigned int getLength();
	
	// gauna grojamos takelio vietos laika
	// @return - takelio vieta milisekundemis
	unsigned int getPos();

	// gauna dainos pavadinima jei nuskaito arba grazina failo varda
	// @return - takelio pavadinimas
	wstring getName();
	
	// grazina ar failas grojamas ir apskritai ar ji imanoma renderinti (tinka atrinkt geriem failam bei nustatyt takelio pabaigai)
	// @return - true/false 
	bool isPlaying();


	bool isUpdated();

	void getSpectrum(float *fl, int num);


	wstring GetTag(const char * tagname);
	wstring GetTag(FMOD::Sound * sound, const char * tagname);

};